查看原文
其他

玩转stata秘籍 | 巧妙利用循环(forvalues)处理股价联动问题

2016-04-06 西安交大 孙俊勤 会计学术联盟
编者注:

  

Stata无疑是会计研究领域实证数据处理与结果呈现的大杀器,为了帮助会计学术研究的小伙伴解决数据处理与结果呈现的疑难问题,会计学术联盟推出"玩转stata秘籍"专栏,陆续刊登联盟小伙伴分享的stata处理小程序。


欢迎小伙伴向我们投稿,请确保是自己编的程序,确保是原创!请附上处理前后的图片及简单程序说明,我们的公共邮箱是:Accounting_AU@yeah.net


红包奖励如果因为您的stata小程序推文获得粉丝的赞赏,我们将以红包方式奖励给您,赞赏越多,奖励越多!在投稿时请告之微信号,谢谢~



推文作者:西安交通大学  博士生  孙俊勤


本文在处理股价联动问题的时候,所受到的启发。

股价联动即两个股票每日收益率之间的关系,用如下公式进行计算。



首先需要将股票i,j等的每日回报率变为一列列的,同时每日还需相对应。本文以2006年部分数据为例,代码为000001-000559,共计155家公司。

use "C:\Users\lenovo\Desktop\案例\origin.dta",clear



replace return=. if return==0     //return为0,认为当天其停牌


egen id1= group(id)  //以id为分组标准,同一id为一组,重新定义id1 ,使得其更有规律从1到155,便于后面的循环


操作结果如下图所示:



save "C:\Users\lenovo\Desktop\案例\origin1.dta",replace

 

use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear

sum id1

forvalues i=1/155{

use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear

keep if id1==`i'

rename return return`i'

drop id1 id

save "C:\Users\lenovo\Desktop\案例/`i'.dta",replace

}


forvalues是循环命令,括号{}内为循环内容,i为循环所引用的,循环内容中表示为`i',每次循环只保留一家公司,即keep if id1==`i'这步,将return变量也进行更名,去掉无关变量id,id1;最终每一家公司保存为1个dta,以便用于下面的合并,下图为第155家的2006年数据。注意点,循环中保存数据最后的一步需要为/,而不是\,即save"C:\Users\lenovo\Desktop\案例/`i'.dta",replace


合并代码如下:

use "C:\Users\lenovo\Desktop\案例/1.dta",clear

forvalues i=2/155{

merge 1:1 time using  "C:\Users\lenovo\Desktop\案例/`i'.dta"

drop _merge

}

save "C:\Users\lenovo\Desktop\案例/final.dta",replace


此处合并不需要删去未匹配,为了保证最大交易日,从而不致丢失数据


最终可得到如下数据,每一列为一个公司一年度的日回报率,如下图所示。



最后再用循环便可以算出股价联动的系数了,以下数据处理操作,读者可以模仿上面所涉及的独立尝试完成。(有问题和不足,欢迎大家指正和交流,谢谢!!)

 

完整代码如下:

use "C:\Users\lenovo\Desktop\案例\origin.dta",clear

replace return=. if return==0   //return为0,认为当天其停牌,故需要改为缺失值


egen id1= group(id)  //以id为分组标准,同一id为一组,重新定义id1


save "C:\Users\lenovo\Desktop\案例\origin1.dta",replace


use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear

forval i=1/155 { 

use "C:\Users\lenovo\Desktop\案例\origin1.dta",clear

keep if id1==`i'

rename return return`i'

drop id1 id

save "C:\Users\lenovo\Desktop\案例/`i'.dta",replace

}

use "C:\Users\lenovo\Desktop\案例/1.dta",clear

forval i=2/155{

merge 1:1 time using  "C:\Users\lenovo\Desktop\案例/`i'.dta"

drop _merge

}

save "C:\Users\lenovo\Desktop\案例/final.dta",replace


关注我们:请点击顶部“会计学术联盟”蓝色小字

朋友圈分享:请点击右上角三个点的图标,进入后点分享到朋友圈。

历史信息查看:请点击我的头像,查看历史信息,即可查看往期推送

直接长按下方二维码,“识别图中二维码”即可轻松关注。

 

如果您想分享您的研究心得或联系我们会计学术联盟微信公众平台,欢迎发送邮件至Accounting_AU@yeah.net,或联系主页君水皮:







您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存